home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
Graphics
/
MapMaker
/
Source
/
fractal.c
< prev
next >
Wrap
Text File
|
1994-04-29
|
3KB
|
112 lines
/*
** fractal.c
** for project : MapMaker
** using NeXTStep and mach Unix.
** CPSC 414 Assignment No. 4 Project
**
** Programmed by Bradley Head and Thomas Burkholder
** December 1990
*/
#import <math.h>
#import <stdlib.h>
#import "pointdata.h"
#import "proj.h"
#import "fractal.h"
float MinLen = 10*toRADS; /* set global variable to initial value */
FractValues fvalues;
/****************************************************/
int setFValues(int Fractalize, float H, float StdDev) { /* set up constants for Fractalizing */
fvalues.Fractalize = Fractalize;
fvalues.H = H;
fvalues.StdDev = StdDev;
}
float Gauss() { /* returns a random number between -0.5 & 0.5 */
double intpart; /* with mean at 0.0 */
float g = 0.0;
int i;
for (i = 1;i <= 23;i++)
g += rand() /(RAND_MAX + 1.0);
g = g/23.0 - 0.5; /* set mean to 0.0 */
return g;
}
void Fract(Point a, Point b, float sdev, PointList *plist)
{
/* this function is used to fractalize
** line segments
*/
float r;
float Len;
Point n;
Len = sqrt((b.x - a.x)*(b.x - a.x) + (b.y - a.y)*(b.y - a.y)); /* compute length between points */
if (Len < (MinLen)) { /* terminating condition: don't fractalize less than this length */
addToPointList(plist,&b); /* add the point to list */
}
else {
sdev *= fvalues.f; /* scale Sdev by f */
r = Gauss()*sdev; /* get gaussian pseudo-random number */
n.x = 0.5*(a.x + b.x) - r*(b.y - a.y); /* compute the middle point */
n.y = 0.5*(a.y + b.y) + r*(b.x - a.x);
n.pen = DOWN;
Fract(a,n,sdev,plist); /* call Fract on segment between a and n */
Fract(n,b,sdev,plist); /* call Fract on segment between b and n */
}
}
void insertFSegments(PointList *pin, PointList *pout, ProjParam *pparam) {
/* This function segments the input list either using a parametric
** insertion technique
** or by fractalizing the line segments of the input list
** the segmented list is returned as the point list pout
** which can then be plotted
*/
float step,t;
float Len;
Point p;
Point *p1;
Point *p2;
int vertex = 0;
MinLen =10*toRADS*fabs(pparam->radius); /* compute minimum length to decide if segmenting */
while (gotoPointInList(pin,vertex,&p1)) { /* while there is a list to segment */
addToPointList(pout,p1); /* add the first point to the output list */
vertex++;
if (gotoPointInList(pin,vertex,&p2)) /* if there is a next vertex then continue */
{
Len = sqrt((p2->x - p1->x)*(p2->x - p1->x) + (p2->y - p1->y)*(p2->y - p1->y));
if (fvalues.Fractalize) {
fvalues.f = exp((0.5 - fvalues.H)*log(2.0)); /* Fractalize stuff to get f */
if (p1->pen == DOWN)
Fract(*p1, *p2, fvalues.StdDev, pout); /* call the recursive function Fract */
else
addToPointList(pout,p2); /* if the pen command is up don't fractalize; just move and store */
}
else { /* else you don't want to Fractalize, so segment */
if ((Len > MinLen) && (p1->pen == DOWN)) {
step = MinLen/Len; /* step increment for parametric segmenting */
for (t=step;t<1.0; t+=step) {
p.x = p1->x + (p2->x - p1->x)*t; /* calculate segment vertex position */
p.y = p1->y + (p2->y - p1->y)*t; /* parametrically */
p.pen = DOWN;
addToPointList(pout,&p); /* add each segment vertex */
}
}
addToPointList(pout,p2); /* add the last point then carry on */
}
}
}
}